package com.example.administrator.music;

import android.Manifest;
import android.annotation.SuppressLint;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;

import com.tbruyelle.rxpermissions2.RxPermissions;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;


/*  存在的仍未实现的问题或不足：
    界面有待美化
    点击ListView列表项没法定位到歌曲
    使用传统的Java方式获取音频文件，但太限制，只获取了mp3后缀的音频文件，但音频文件还有许多，
若使用Media的方法获取能获取到的范围广一点，后续可以更新以下整体框架
    没使用Service
    等等.



 */


public class MainActivity extends AppCompatActivity implements Runnable {
    private String TAG = this.getClass().getSimpleName();
    int flag = 1;//设置一个标志，供点击“开始/暂停”按钮使用
    private Button btnStart, btnStop, btnNext, btnLast;
    private TextView txtInfo;
    private ListView listView;
    private SeekBar seekBar;
    private MusicService musicService;
    private Handler handler;// 处理改变进度条事件
    int UPDATE = 0x101;

    private boolean isPause;// 判断是从暂停中恢复还是重新播放

    int playMode = 0;   //控制播放方式，0为顺序播放，1为随机播放，2为单曲循环


    @SuppressLint("CheckResult")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();

        //动态获取权限
        new RxPermissions(this).request(
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE).subscribe((aBoolean) -> {
            if (aBoolean) {
                initData();
            } else {
                showToast("缺少读取存储权限，部分功能无法使用");
                Log.e(TAG, "缺少读取存储权限，部分功能无法使用");
            }
        });
    }

    /**
     * 初始化组件
     */
    private void initView() {
        //注册组件
        btnStart = findViewById(R.id.btn_star);
        btnStop = findViewById(R.id.btn_stop);
        btnLast = findViewById(R.id.btn_last);
        btnNext = findViewById(R.id.btn_next);
        seekBar = findViewById(R.id.sb);
        txtInfo = findViewById(R.id.text_playing);
        //注册监听
        btnStart.setOnClickListener(this::onClick);
        btnStop.setOnClickListener(this::onClick);
        btnLast.setOnClickListener(this::onClick);
        btnNext.setOnClickListener(this::onClick);
        //注册进度条监听信息
        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            /**
             * 用于监听SeekBar进度值的改变
             * @param seekBar
             * @param i
             * @param b
             */
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {

            }

            /**
             * 用于监听SeekBar开始拖动
             * @param seekBar
             */
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            /**
             * 用于监听SeekBar停止拖动  SeekBar停止拖动后的事件
             * @param seekBar
             */
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                int progress = seekBar.getProgress();
                Log.i("TAG:", "" + progress + "");
                //得到该首歌曲最长秒数
                int musicMax = musicService.player.getDuration();
                int seekBarMax = seekBar.getMax();
                //跳到该曲该秒
                musicService.player
                        .seekTo(musicMax * progress / seekBarMax);

            }
        });
    }

    /**
     * 初始化数据
     */
    @SuppressLint({"HandlerLeak"})
    private void initData() {
       /* copyReadTxtToSdcard();*/

        //当获取到权限以后，进行初始化获取内容
        musicService = new MusicService();
        try {
            initListViewDataAdapter();
        } catch (Exception e) {
            Log.i("TAG", "读取信息失败");
        }
        Thread thread = new Thread(this);// 自动改变进度条的线程
        //实例化一个handler对象
        handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                //更新UI
                int mMax = musicService.player.getDuration();//最大秒数
                if (msg.what == UPDATE) {
                    try {
                        seekBar.setProgress(msg.arg1);
                        txtInfo.setText(setPlayInfo(msg.arg2 / 1000, mMax / 1000));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } else {
                    seekBar.setProgress(0);
                    txtInfo.setText("播放已经停止");
                }
            }
        };
        thread.start();
    }

    /**
     * 初始化列表Mp3信息
     */
    private void initListViewDataAdapter() {
        String[] str = new String[musicService.musicList.size()];
        int i = 0;
        for (String path : musicService.musicList) {
            File file = new File(path);
            str[i++] = file.getName();
        }
        ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, str);
        listView = findViewById(R.id.List_Songs);
        listView.setAdapter(adapter);
    }

    /**
     * 点击事件
     *
     * @param view 点击的组件
     */
    private void onClick(View view) {
        switch (view.getId()) {
            //暂停/开始
            case R.id.btn_star:
                start();
                break;
            //停止
            case R.id.btn_stop:
                stop();
                break;
            //上一首
            case R.id.btn_last:
                last();
                break;
            //下一首
            case R.id.btn_next:
                next();
                break;
        }
    }


    /**
     * 暂停/开始
     */
    private void start() {
        try {
            /**
             * 引入flag作为标志，当flag为1 的时候，此时player内没有东西，所以执行musicService.play()函数
             * 进行第一次播放，然后flag自增二不再进行第一次播放
             * 当再次点击“开始/暂停”按钮次数即大于1 将执行暂停或继续播放goplay()函数
             */
            if (flag == 1) {
                musicService.play();
                flag++;
            } else {
                if (!musicService.player.isPlaying()) {
                    musicService.goPlay();
                } else if (musicService.player.isPlaying()) {
                    musicService.pause();
                }
            }
        } catch (Exception e) {
            Log.i("LAT", "开始异常！");
        }
    }

    /**
     * 停止
     */
    private void stop() {
        try {
            musicService.stop();
            flag = 1;//当点击停止按钮时，flag置为1
            seekBar.setProgress(0);
            txtInfo.setText("播放已经停止");
        } catch (Exception e) {
            Log.i("LAT", "停止异常！");
        }
    }

    /**
     * 上一曲
     */
    private void last() {
        try {
            musicService.last();
        } catch (Exception e) {
            Log.i("LAT", "上一曲异常！");
        }
    }

    /**
     * 下一曲
     */
    private void next() {
        try {
            musicService.next(playMode);
        } catch (Exception e) {
            Log.i("LAT", "下一曲异常！");
        }
    }


    @Override
    public void run() {
        int position, mMax, sMax;
        while (!Thread.currentThread().isInterrupted()) {
            if (musicService.player != null && musicService.player.isPlaying()) {
                position = musicService.getCurrentProgress();//得到当前歌曲播放进度(秒)
                mMax = musicService.player.getDuration();//最大秒数
                sMax = seekBar.getMax();//seekBar最大值，算百分比
                Message m = handler.obtainMessage();//获取一个Message
                m.arg1 = position * sMax / mMax;//seekBar进度条的百分比
                m.arg2 = position;
                m.what = UPDATE;
                handler.sendMessage(m);
                //  handler.sendEmptyMessage(UPDATE);
                try {
                    Thread.sleep(1000);// 每间隔1秒发送一次更新消息
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }

    }


    /**
     * 设置当前播放的信息
     *
     * @param position
     * @param max
     * @return
     */
    private String setPlayInfo(int position, int max) {
        String info = "正在播放:  " + musicService.songName + "\t\t";
        int pMinutes = 0;
        while (position >= 60) {
            pMinutes++;
            position -= 60;
        }
        String now = (pMinutes < 10 ? "0" + pMinutes : pMinutes) + ":"
                + (position < 10 ? "0" + position : position);

        int mMinutes = 0;
        while (max >= 60) {
            mMinutes++;
            max -= 60;
        }
        String all = (mMinutes < 10 ? "0" + mMinutes : mMinutes) + ":"
                + (max < 10 ? "0" + max : max);

        return info + now + " / " + all;
    }

    /**
     * 吐司信息
     *
     * @param msg 消息
     */
    private void showToast(String msg) {
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_order,menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        switch (id){
            case R.id.menu_order:
                playMode = 0;
                return true;
            case R.id.menu_random:
                playMode = 1;
                return true;
            case R.id.menu_loop:
                playMode = 2;
                return true;

        }

        return super.onOptionsItemSelected(item);
    }


}


